/**
 * learn-seajs
 *
 * require
 *
 * date: 2020-10-2
 * ----------------
 *
 * 如果想要模块内，引入其他模块，
 * 建议使用 require 引入 步骤如下：
 *  1、利用 require
 */

define(123)


// 定义模块是，使用最多的方式是：参数为 一个回调(函数)
define(function(require, exports, module) {
  // console.log(arguments)
  // console.log(require)
  // console.log(exports)
  // console.log(module)


  // 1、利用 require
  const test = require('module/Test')
  // 调用模块，读取模块信息
  console.log('test=', test)
})


// define(function(require, exports, module) {
//   const test = require('module/Test')
//   console.log('test=', test)
// })

// -------------------------------------

// require 在使用上的一些问题
// 1、require 不能简写/多写 (例如 req)
// define(function(req, exports, module) {
//   const test = req('module/Test')
//   console.log('test=', test)
// })

// define(function(requiress, exports, module) {
//   const test = requiress('module/Test')
//   console.log('test=', test)
// })

// 说明 require 是写的

// 2、require 不能被赋值, 也不能赋值给它变量
// define(function(require, exports, module) {

//   // require 赋值后，它的功能就失效了

//   // 赋值给它变量 (js 变量 作用域问题)
//   const re = require
//   const test = re('module/Test')
//   console.log('test=', test)
// })


// 不作为参考
// 3 不能作为函数的参数的使用，也是 赋值给它变量
// define(function(require, exports, module) {
//   // undefine
//   // function fn(a) {
//   //   const test = a('module/Test')
//   //   console.log('test=', test)
//   // }
//   // fn(require)

//   function fn(require) {
//     const test = require('module/Test')
//     console.log('test=', test)
//   }
//   fn(require)
// })

// 4 require 方法中，参数不能直接使用字符拼接
// define(function(require, exports, module) {
//   console.log(require)
//   // 1 报错
//   const test = require('module/' + 'Test')
//   console.log('test=', test)

//   // 不报错，但 undefine
//   // const path = 'module/' + 'Test'
//   // const test2 = require(path)
//   // console.log('test2=', test2)
// })
// require 的参数，使用 正则表达式 检查的








// -------------------------------------

// 引入具有id的模块
// 如果一个模块中没有显示的id，可以直接引入：
//              具有显示的id，不能直接引入

// 1、错误示范
// (1)
define(function (require) {
  const testA = require('module/A')
  console.log(testA)
})

// (2) 字符串: 是指向 自己, 不可以
define('module/A', function (require, exports, module) {
  const testA = require('a')
  console.log(testA)
})

// 2、数组(自己和其他模块id) - 引入具有id的模块，需要依赖引入模块
// 简写
define(['module/A'], function (require, exports, module) {
  const testA = require('a')
  console.log(testA)
  return testA.a
})

// 全写
// 上节课 -> 三、传递三个参数
// 第一个参数是 字符串，指定模块id
// 第二个参数是 数组，存储的是模块的依赖集合
// 第三个参数是 回调
define('module/main', ['module/A'], function (require, exports, module) {
  const testA = require('a')
  console.log(testA)
  return testA.a
})

// 全写 - 错误示范
// define('module/main', ['module/A'], function (require, exports, module) {
//   const testA = require('module/A') // 因为模块有id，那么默认不是路径，so
//   console.log(testA)
//   let a = 'unknow'
//   if (testA && typeof testA === 'object') {
//     a = testA.a || '2 unkonw'
//   }
//   return a
// })